/*
 *  Scripts incluídos antes deste:
 *      - API do Google Maps;
 *      - jquery.js;
 *      - jquery.maskedinput.js
 *      - bootstrap.js
 *      - googleMaps.js
 *      - login.js
 */

/* =========================================================================
 * Função que executa uma pesquisa de estabelecimentos a partir dos
 * critérios especificados na interface.
 * ========================================================================= */
function executeQuery(all) {
    var queryArgs;

    // Se for uma consulta por todos os estabelecimentos, faz a
    // requisição com argumentos pré-definidos.
    if (all) {
        // Monta o objeto com os argumentos da query.
        queryArgs = {
            latitude: 0,
            longitude: 0,
            distanciaMax: 0,
            precoMax: 0.0,
            tipos: null,
            estilos: null,
            abertura: null,
            fechamento: null,
            avaliacao: 0.0,
            descricao: null,
            somenteAbertos: false    
        }; 
    }
    // Caso contrário, obtém os argumentos da requisição a partir dos
    // componentes de interface.
    else {
        // Obtém os critérios de pesquisa.
        var pontoPartida = _userMarker.getPosition();
        var distanciaMax = $('#distancia').val();
        var precoMax = $('#preco').val();
        var tipos = $('#opcoesTipos').val();
        var estilos = $('#opcoesEstilos').val();
        var abertura = $('#horario1').val();
        var fechamento = $('#horario2').val();
        var avaliacao = $('#avaliacao').val();
        var descricao = $('#descricao').val();
        var somenteAbertos = $('#abertosCheck').is(':checked');

        // Monta o objeto com os argumentos da query.
        // Alguns deles precisam ser adaptados caso não tenham sido fornecidos.
        queryArgs = {
            latitude: pontoPartida.lat(),
            longitude: pontoPartida.lng(),
            distanciaMax: (distanciaMax ? distanciaMax : 0),
            precoMax: (precoMax ? precoMax : 0.0),
            tipos: (tipos ? tipos.join(',') : null),
            estilos: (estilos ? estilos.join(',') : null),
            abertura: (abertura !== '' ? abertura : null),
            fechamento: (fechamento !== '' ? fechamento : null),
            avaliacao: (avaliacao ? avaliacao : 0.0),
            descricao: (descricao !== '' ? descricao : null),
            somenteAbertos: somenteAbertos
        };
    }

    // Manda fazer a requisição.
    queryRequest(queryArgs);
}

/* =========================================================================
 * Função que faz uma requisição assíncrona (Ajax) de pesquisa por
 * estabelecimentos no banco de dados.
 * ========================================================================= */
function queryRequest(params) {
    var url = "/ajax/queryProcessor.jsp";

    // Faz a requisição passando os parâmetros e as funções callback.
    $.ajax(url, {
        crossDomain: true,
        type: 'POST',
        encoding: 'ISO-8859-1',
        data: params
    }).done(function(data, textStatus) {
        queryResponse(data, textStatus);
    }).fail(function(data, textStatus) {
        var errorMsg = "ERRO: Não foi possível processar a requisição.";
        queryFailure(errorMsg);
    });
}

/* =========================================================================
 * Função callback que executa quando a requisição assíncrona é
 * bem-sucedida.
 * ========================================================================= */
function queryResponse(data, textStatus) {
    var obj = JSON.parse(data.trim());
    querySuccess(obj.stat, obj.results);
}

/* =========================================================================
 * Continuação da função acima. Remove os resultados de pesquisas
 * anteriores e manda exibir os novos ao usuário.
 * ========================================================================= */
function querySuccess(stat, results) {
    // Caso esteja na página de pesquisas.
    if (window.location.pathname == '/' ||
        window.location.pathname == '/index.jsp') {
        var message;
        var responseDiv = $('#responseDiv').empty();

        // Limpa resultados de pesquisas anteriores
        deleteOverlay();
        $('#directionsPanel').empty();

        // Caso não haja nenhum resultado
        if (stat == 0) {
            message = "A sua consulta não retornou nenhum resultado.";
        }
        // Caso haja resultados
        else {
            message = "A sua consulta retornou " + stat + " resultados.";
            displayResults(results);
        }
        var html = '<div class="alert alert-info">' +
                   '<button type="button" class="close" data-dismiss="alert">&times;</button>' +
                   '<span class="label label-info"><i class="icon-info-sign icon-white"></i></span> ' +
                    message + '</div>';
        responseDiv.fadeIn(500).delay(5000).fadeOut(500);
        responseDiv.append(html);
    }
    // Caso esteja em outra página, não há necessidade de mostrar as
    // mensagens de retorno, então apenas insere os marcadores e info
    // windows no mapa.
    else {
        displayResults(results);
    }
}

/* =========================================================================
 * Função principal que executa apenas quando o documento estiver
 * completamente carregado.
 * ========================================================================= */
function queryFailure(errorMsg) {
    // Caso esteja na página de pesquisas.
    if (window.location.pathname == '/' ||
        window.location.pathname == '/index.jsp') {
        // Exibe a mensagem de erro
        var responseDiv = $('#responseDiv').empty();
        var html = '<div class="alert alert-error">' +
                   '<button type="button" class="close" data-dismiss="alert">&times;</button>' +
                   '<span class="label label-important"><i class="icon-remove icon-white"></i></span> ' +
                        errorMsg + '</div>';
        responseDiv.fadeIn(500).delay(5000).fadeOut(500);
        responseDiv.append(html);
    }
    // Caso esteja em outra página.
    else {
        // alert(errorMsg);
    }
}

/* =========================================================================
 * Função que exibe os resultados de uma pesquisa na interface de usuário.
 * ========================================================================= */
function displayResults(results) {
    // Para cada ponto que consta no resultado da busca, cria um marcador
    // e uma info window com todas as informações necessárias.
    for (var i in results) {
        // Define a geolocalização.
        var latitude = results[i].geolocalizacao.coordinates.coordinates[0].x;
        var longitude = results[i].geolocalizacao.coordinates.coordinates[0].y;
        var location = new google.maps.LatLng(latitude, longitude);

        // Define a lista de especialidades/estilos.
        var arrayAux = [];
        for (var j in results[i].estilos) {
            arrayAux.push(results[i].estilos[j].estilo);
        }

        // Preenche os dados do estabelecimento em um objeto.
        var place = {
            id: results[i].id,
            geolocalizacao: location,
            nome: results[i].nome,
            telefone: results[i].telefone,
            email: results[i].email,
            horaAbre: results[i].horaAbre,
            horaFecha: results[i].horaFecha,
            avaliacaoMedia: results[i].avaliacaoMedia,
            quantidadeAvaliacoes: results[i].quantidadeAvaliacoes,
            precoMedio: results[i].precoMedio,            
            tipo: results[i].tipo.tipo,
            estilos: arrayAux,
            descricao: results[i].cardapio,
            quemCadastrou: {
                nome: (results[i].cadastradoPor?results[i].cadastradoPor.nome:null),
                email: (results[i].cadastradoPor?results[i].cadastradoPor.email:null)
            }
        };

        // Define o ícone do marcador a partir de uma especialidade ou tipo.
        var icon;
        if (place.estilos[0]) {
            var name = place.estilos[0].toLowerCase().replace(' ', '_');
            icon = _icons.specialties[name];
        }
        if (typeof icon == 'undefined') {
            var name = place.tipo.toLowerCase().replace(' ', '_')
            icon = _icons.types[name];
        }
        if (typeof icon == 'undefined') {
            icon = _icons['generic'];
        }

        // Coloca o marcador e manda criar a info window.
        var marker = placeMarker(location, icon, false);
        createInfoWindowContent(place, marker);
    }
}
